package JUC;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 豆包LU
 * @date 2023/5/9 17:02
 */
public class CustomThreadPool {

    public static void main(String[] args) {
        // 核心线程数，即线程池中一直存活的线程数，如果线程池中的线程数小于该数，就会创建新的线程来执行任务
        int corePoolSize = 2;
        // 最大线程数，即线程池中最多能同时执行的线程数，如果队列中的任务数超过了该数，新提交的任务就会被拒绝
        int maxPoolSize = 4;
        // 线程池维护线程所允许的空闲时间，单位为时间单位，当超过该时间时，多余的线程会被销毁
        long keepAliveTime = 10;
        // 时间单位，用于指定 keepAliveTime 的时间单位
        TimeUnit timeUnit = TimeUnit.SECONDS;
        // 阻塞队列，用于存放等待执行的任务，如果线程池中的线程数已经达到 corePoolSize，并且队列已满，此时新提交的任务就会被拒绝
        LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(2);

        // 创建线程池，并指定各个参数
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,      // 核心线程数
                maxPoolSize,       // 最大线程数
                keepAliveTime,     // 线程池维护线程所允许的空闲时间
                timeUnit,          // 时间单位
                blockingQueue      // 阻塞队列
        );

        // 提交任务
        for (int i = 0; i < 10; i++) {
            executor.submit(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 执行任务");
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}
